/**
 * 打开已存在的数据库，如果数据库不存在，则会创建一个新的数据库
 * return openDatabase(dbname, version, dbdesc, dbsize, createCallback); 
 *  dbname：数据库名称
 *  version：版本号
 *  dbdesc：描述文本
 *  dbsize：数据库大小
 *  createCallback：创建回调 创建回调会在创建数据库后被调用
 *  return：打开的数据库

 * 事务
 * void transaction(querysql,  errorCallback,  successCallback); 
 *  querysql：事务回调函数，其中可以执行 SQL 语句。（必选）
 *  errorCallback：出错回调函数。（可选）
 *  successCallback：执行成功回调函数。（可选）

 * 执行
 * void executeSql(sqlStatement, arguments, callback, errorCallback); 
 *  sqlStatement：SQL 语句。（必选）
 *  arguments：SQL 语句需要的参数，是一个按照sql语句中的？先后顺序排列的一维数组。（可选）
 *  callback：回调函数。（可选）
 *  errorCallback：出错回调函数。（可选）
 */

var db = {}

export default {
    // 打开数据库
    openDB(name) {
        return new Promise((resolve, reject) => {
            try {
                db[name] = openDatabase(name, '', 'uni-app', 2 * 1024 * 1024, (e) => {
                    // 这个方法只有没有数据库的时候才会被调用
                });
                resolve()
            } catch (e) {
                reject(e)
            }
        })
    },

    // 执行sql之前如果没有打开数据库，则打开
    beforeSql(func, name, ...args) {
        return new Promise((resolve, reject) => {
            this.openDB(name).then(res => {
                resolve(func.call(this, name, ...args))
            }).catch((err) => {
                reject(err)
            });
        });
    },

    // 执行SQL语句
    execute(name, sql) {
        if (!db[name]) {
            return this.beforeSql(this.execute, ...arguments)
        }
        return new Promise((resolve, reject) => {
            db[name].transaction(function(tx) {
                if (Array.isArray(sql)) {
                    for (let i = 0; i < sql.length; i++) {
                        tx.executeSql(sql[i])
                    }
                } else {
                    tx.executeSql(sql)
                }
            }, (e) => {
                // 注意：这里是出错回调
                reject(e)
            }, (e) => {
                // 注意：这里是成功回调
                resolve(e)
            });
        });
    },

    // 查询SQL语句
    select(name, sql) {
        if (!db[name]) {
            return this.beforeSql(this.select, ...arguments)
        }
        return new Promise((resolve, reject) => {
            db[name].transaction(function(tx) {
                tx.executeSql(sql, [], (tx, results) => {
                    resolve(results.rows)
                }, (e) => {
                    reject(e)
                })
            });
        });
    },
}
